package com.work.daily.javabasics;

import lombok.SneakyThrows;

import java.nio.file.*;

/**
 * 监控文件文件夹
 *
 * @author Shengkang.Mo
 * @create 2021-02-07 9:33
 * @description WatchService是采用扫描式的，效率低。
 * WatchService代码写起来费劲。虽然上面看起来很简洁了，但是实际开发时麻烦。
 * WatchService不能监听到多级目录，事先父文件夹需要存在。
 * @source https://www.toutiao.com/i6918965162707845639/?tt_from=weixin&utm_campaign=client_share&wxshare_count=1&timestamp=1612661661&app=news_article&utm_source=weixin&utm_medium=toutiao_android&use_new_style=1&req_id=202102070934210102120562130819D3B3&share_token=a67657ef-b266-4c07-9875-83e6a3620b48&group_id=6918965162707845639
 */
public class WatchServiceDemo {
    @SneakyThrows
    public static void main(String[] args) {
        //第一步：取得 WatchService
        WatchService watchService = FileSystems.getDefault().newWatchService();
        //第二步：确定要监控的文件目录
        Path path = Paths.get("D:\\project");
        //第三步：为路径绑定 WatchService，并确定监控事件
        path.register(watchService,
                StandardWatchEventKinds.ENTRY_CREATE,
                StandardWatchEventKinds.ENTRY_DELETE,
                StandardWatchEventKinds.ENTRY_MODIFY);

        WatchKey watchKey = watchService.take();
        //第四步：当有事件时，开始触发
        while (null != watchKey) {
            for (WatchEvent<?> pollEvent : watchKey.pollEvents()) {
                System.out.println("事件：" + pollEvent.kind() + "发生了，文件是：" + pollEvent.context());
            }
            watchKey.reset();
        }
    }
}
